<?php

use Nette\Application\UI\Form,
    Nette\Security as NS,
    Nette\Utils\Strings,
    Nette\Mail\Message;

/**
 * Sign in/out presenters.
 *
 * @author     Pavel Homolka
 * @package    2Perfection
 */
class SignPresenter extends BasePresenter {

    public function actionOut() {
	$this->getUser()->logout();
	$this->flashMessage('Byli jste odhlášeni.');
	$this->redirect('Homepage:default');
    }

    /**
     * Registration form component factory.
     * @return Nette\Application\UI\Form
     */
    protected function createComponentRegistrationForm() {
	$form = new Form;

	$form->addText('firstName', 'Jméno: *')
		->addRule(Form::FILLED, 'Zadejte své jméno.');

	$form->addText('secondName', 'Přijmení: *')
		->addRule(Form::FILLED, 'Zadejte své přijmení.');

	$form->addText('login', 'Přihlašovací jméno: *')
		->addRule(Form::FILLED, 'Zadejte své přihlašovací jméno.');

	$form->addText('mail', 'Váš mail: *')
		->addRule(Form::EMAIL, 'Zadejte svůj e-mail.');

	$form->addPassword("password", "Heslo: *")
		->addRule(Form::FILLED, "Heslo musí být vyplněné !");

	$form->addPassword("confirm_password", "Znovu heslo: *")
		->addRule(Form::FILLED, "Potvrzovací heslo musí být vyplněné !")
		->addConditionOn($form["password"], Form::FILLED)
		->addRule(Form::EQUAL, "Hesla se musí shodovat !", $form["password"]);

	$form->addSubmit('send', 'REGISTROVAT');

	$form->onSuccess[] = callback($this, 'registrationFormSubmitted');
	return $form;
    }

    public function registrationFormSubmitted($form) {
	$values = $form->getValues();

	try {
	    $this->db->exec('INSERT INTO users', array(
		'firstName' => $values['firstName'],
		'secondName' => $values['secondName'],
		'login' => $values['login'],
		'password' => md5($values['password']),
		'mail' => $values['mail'],
		'role' => 2,
	    ));

	    $this->flashMessage('Registrace proběhla úspěšně.');
	    $this->user->login($values['login'], $values['password']);
	    $this->redirect('Homepage:default');
	} catch (PDOException $exc) {
	    switch ($exc->getCode()) {
		case '23000':
		    $this->flashMessage('Přihlašovací jméno ' . $values['login'] . ' je již obsazeno.');
		    break;
		default:
		    break;
		    $this->flashMessage('Registrace selhala z neznámého důvodu.');
	    }
	}
    }

    /**
     * Change form component factory.
     * @return Nette\Application\UI\Form
     */
    protected function createComponentChangeForm() {
	$form = new Form;

	$form->addGroup('Změna osobních údajů');

	$form->addText('firstName', 'Jméno:')
		->setDefaultValue($this->user->identity->data['firstName'])
		->addRule(Form::FILLED, 'Zadejte své jméno.');

	$form->addText('secondName', 'Přijmení:')
		->setDefaultValue($this->user->identity->data['secondName'])
		->addRule(Form::FILLED, 'Zadejte své přijmení.');

	$form->addText('mail', 'Váš mail:')
		->setDefaultValue($this->user->identity->data['mail'])
		->addRule(Form::EMAIL, 'Chybný formát e-mailu.');

	$form->addSubmit('send', 'ZMĚNIT');

	$form->onSuccess[] = callback($this, 'changeFormSubmitted');
	return $form;
    }

    public function changeFormSubmitted($form) {
	$values = $form->getValues();
	try {
	    $this->db->exec('UPDATE users SET ? WHERE id=?', $values, $this->user->id);
	    $this->user->identity->__set('firstName', $values['firstName']);
	    $this->user->identity->__set('secondName', $values['secondName']);
	    $this->user->identity->__set('mail', $values['mail']);
	    $this->flashMessage('Změna osobních údajů byla provedena.');
	    //$this->redirect('Homepage:default');
	} catch (PDOException $exc) {
	    switch ($exc->getCode()) {
		case '':
		default:
		    break;
		    $this->flashMessage('Změna osobních udajů selhala z neznámého důvodu.');
	    }
	}
    }

    protected function createComponentChangePasswordForm() {
	$form = new Form();

	$form->addGroup('Změna hesla');

	$form->addPassword("password_old", "Heslo: *")
		->addRule(Form::FILLED, "Heslo musí být vyplněné !");

	$form->addPassword("password_new", "Nové heslo: *")
		->addRule(Form::FILLED, "Nové heslo musí být vyplněno!");

	$form->addPassword("confirm_password", "Nové heslo znovu: *")
		->addRule(Form::FILLED, "Potvrzovací heslo musí být vyplněné !")
		->addConditionOn($form["password_new"], Form::FILLED)
		->addRule(Form::EQUAL, "Hesla se musí shodovat !", $form["password_new"]);

	$form->addSubmit('send', 'ZMĚNIT');

	$form->onSuccess[] = callback($this, 'changePasswordFormSubmitted');
	return $form;
    }

    public function changePasswordFormSubmitted($form) {
	$values = $form->getValues();
	$pass = $this->db->query('SELECT password FROM users WHERE id = ?', $this->user->id)->fetch()->offsetGet('password');

	if (md5($values['password_old']) !== $pass) {
	    $this->flashMessage('Chybné heslo.');
	} else {
	    $this->db->exec('UPDATE users SET ? WHERE id=?', array('password' => md5($values['password_new'])), $this->user->id);
	    $this->flashMessage('Heslo bylo úspěšně změněno.');
	}
    }

    public function createComponentForgotPassword() {
	$form = new Form();

	$form->addText('login', 'Přihlašovací jméno: *')
		->addRule(Form::FILLED, 'Zadejte své přihlašovací jméno.');
	$form->addText('mail', 'Váš mail: *')
		->addRule(Form::EMAIL, 'Zadejte svůj e-mail.');

	$form->addSubmit('send', 'Nové heslo');

	$form->onSuccess[] = callback($this, 'forgotPasswordFormSubmitted');
	return $form;
    }

    public function forgotPasswordFormSubmitted($form) {
	$values = $form->getValues();

	$login = $this->db->query('SELECT login FROM users WHERE login = ?', $values['login'])->fetch();

	if (!$login) {
	    $this->flashMessage('Přihlašovací jméno ' . $values['login'] . ' nebylo nalezeno.');
	} else {
	    $newPass = Strings::random();
	    $this->db->exec('UPDATE users SET ? WHERE login = ?', array('password' => md5($newPass)), $login->offsetGet('login'));
	    $mail = new Message;
	    $mail->setFrom('2Perfection <test@2perfection.cz>')
		    ->addTo($values['mail'])
		    ->setSubject('Nové heslo')
		    ->setBody("Dobrý den," . "\n" . "Vaše nové heslo pro web 2Perfection.cz je " . $newPass . ".")
		    ->send();
	    $this->flashMessage('Nové heslo bylo odesláno na Váš e-mail.');
	}
    }

}
